{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import r2_score  # 评价回归预测模型的性能\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.preprocessing import MaxAbsScaler\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.linear_model import LassoCV"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1.导入数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.1 丢弃不需要的特征、以及强相关特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 导入数据\n",
    "data_day = pd.read_csv(\"./data/day.csv\")\n",
    "data = data_day.drop([\"instant\", \"dteday\", \"temp\", \"casual\", \"registered\"], axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.2 训练数据和测试数据分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(365, 10)\n",
      "(366, 10)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>dteday</th>\n",
       "      <th>season</th>\n",
       "      <th>yr</th>\n",
       "      <th>mnth</th>\n",
       "      <th>holiday</th>\n",
       "      <th>weekday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>weathersit</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>casual</th>\n",
       "      <th>registered</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2011-01-01</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.344167</td>\n",
       "      <td>0.363625</td>\n",
       "      <td>0.805833</td>\n",
       "      <td>0.160446</td>\n",
       "      <td>331</td>\n",
       "      <td>654</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>2011-01-02</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.363478</td>\n",
       "      <td>0.353739</td>\n",
       "      <td>0.696087</td>\n",
       "      <td>0.248539</td>\n",
       "      <td>131</td>\n",
       "      <td>670</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2011-01-03</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.196364</td>\n",
       "      <td>0.189405</td>\n",
       "      <td>0.437273</td>\n",
       "      <td>0.248309</td>\n",
       "      <td>120</td>\n",
       "      <td>1229</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>2011-01-04</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.200000</td>\n",
       "      <td>0.212122</td>\n",
       "      <td>0.590435</td>\n",
       "      <td>0.160296</td>\n",
       "      <td>108</td>\n",
       "      <td>1454</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>2011-01-05</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.226957</td>\n",
       "      <td>0.229270</td>\n",
       "      <td>0.436957</td>\n",
       "      <td>0.186900</td>\n",
       "      <td>82</td>\n",
       "      <td>1518</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>2011-01-06</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0.204348</td>\n",
       "      <td>0.233209</td>\n",
       "      <td>0.518261</td>\n",
       "      <td>0.089565</td>\n",
       "      <td>88</td>\n",
       "      <td>1518</td>\n",
       "      <td>1606</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>2011-01-07</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0.196522</td>\n",
       "      <td>0.208839</td>\n",
       "      <td>0.498696</td>\n",
       "      <td>0.168726</td>\n",
       "      <td>148</td>\n",
       "      <td>1362</td>\n",
       "      <td>1510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>2011-01-08</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.165000</td>\n",
       "      <td>0.162254</td>\n",
       "      <td>0.535833</td>\n",
       "      <td>0.266804</td>\n",
       "      <td>68</td>\n",
       "      <td>891</td>\n",
       "      <td>959</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant      dteday  season  yr  mnth  holiday  weekday  workingday  \\\n",
       "0        1  2011-01-01       1   0     1        0        6           0   \n",
       "1        2  2011-01-02       1   0     1        0        0           0   \n",
       "2        3  2011-01-03       1   0     1        0        1           1   \n",
       "3        4  2011-01-04       1   0     1        0        2           1   \n",
       "4        5  2011-01-05       1   0     1        0        3           1   \n",
       "5        6  2011-01-06       1   0     1        0        4           1   \n",
       "6        7  2011-01-07       1   0     1        0        5           1   \n",
       "7        8  2011-01-08       1   0     1        0        6           0   \n",
       "\n",
       "   weathersit      temp     atemp       hum  windspeed  casual  registered  \\\n",
       "0           2  0.344167  0.363625  0.805833   0.160446     331         654   \n",
       "1           2  0.363478  0.353739  0.696087   0.248539     131         670   \n",
       "2           1  0.196364  0.189405  0.437273   0.248309     120        1229   \n",
       "3           1  0.200000  0.212122  0.590435   0.160296     108        1454   \n",
       "4           1  0.226957  0.229270  0.436957   0.186900      82        1518   \n",
       "5           1  0.204348  0.233209  0.518261   0.089565      88        1518   \n",
       "6           2  0.196522  0.208839  0.498696   0.168726     148        1362   \n",
       "7           2  0.165000  0.162254  0.535833   0.266804      68         891   \n",
       "\n",
       "    cnt  \n",
       "0   985  \n",
       "1   801  \n",
       "2  1349  \n",
       "3  1562  \n",
       "4  1600  \n",
       "5  1606  \n",
       "6  1510  \n",
       "7   959  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# # 日期类型\n",
    "# data_day['dteday'] = pd.to_datetime(data_day['dteday'])\n",
    "# data = data_day.set_index(\"dteday\", drop=True)\n",
    "data_2011 = data[data_day[\"yr\"] == 0].drop(['yr'], axis=1)\n",
    "data_2012 = data[data_day[\"yr\"] == 1].drop(['yr'], axis=1)\n",
    "\n",
    "print(data_2011.shape)\n",
    "print(data_2012.shape)\n",
    "# 查看前5条数据\n",
    "data_day.head(8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2.数据预处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1去除异常数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(358, 10)\n"
     ]
    }
   ],
   "source": [
    "# data_2011 = data_2011[data_2011[\"cnt\"] > 1200]\n",
    "data_2011 = data_2011[data_2011[\"atemp\"] < 0.8]\n",
    "data_2011 = data_2011[data_2011[\"hum\"] > 0.27]\n",
    "data_2011 = data_2011[data_2011[\"windspeed\"] < 0.4]\n",
    "print(data_2011.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['season', 'mnth', 'holiday', 'weekday', 'workingday', 'weathersit',\n",
      "       'atemp', 'hum', 'windspeed'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "y_train = data_2011['cnt'].values\n",
    "X_train = data_2011.drop('cnt', axis=1)\n",
    "y_test = data_2012['cnt'].values\n",
    "X_test = data_2012.drop('cnt', axis=1)\n",
    "columns = X_train.columns\n",
    "print(columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 对数据进行标准化，y值做了归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分别初始化对特征和目标值的标准化器\n",
    "ss_X = StandardScaler()\n",
    "ss_y = StandardScaler()\n",
    "mas_y = MaxAbsScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征以及目标值进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "X_test = ss_X.transform(X_test)\n",
    "\n",
    "y_train = mas_y.fit_transform(y_train.reshape(-1, 1))\n",
    "y_test = mas_y.fit_transform(y_test.reshape(-1, 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3.确定模型类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.1 尝试缺省参数的线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                        coef     columns\n",
      "6      [0.15337438668107722]       atemp\n",
      "0       [0.0663166033313414]      season\n",
      "3      [0.01165296559275157]     weekday\n",
      "4  [-0.00019464679464113914]  workingday\n",
      "1   [-0.0013982385782882406]        mnth\n",
      "2    [-0.008215187791432333]     holiday\n",
      "8    [-0.027034963344830288]   windspeed\n",
      "7     [-0.02843015804487096]         hum\n",
      "5    [-0.039158976103326186]  weathersit\n"
     ]
    }
   ],
   "source": [
    "# 使用默认配置初始化\n",
    "lr = LinearRegression()\n",
    "\n",
    "# 训练模型参数\n",
    "lr.fit(X_train, y_train)\n",
    "# 预测\n",
    "y_train_pred_lr = lr.predict(X_train)\n",
    "y_test_pred_lr = lr.predict(X_test)\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\": list(columns), \"coef\": list(lr.coef_.T)})\n",
    "fs = fs.sort_values(by=['coef'], ascending=False)\n",
    "print(fs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAekAAAFsCAYAAADos0H8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAHA5JREFUeJzt3XuUXWWZ5/HvQygIQyAQqGAghEAL\nKLdUsAikEQhGBA0QepYjbXMJCySIMt4dubSLksYZFdRuBoYZvAECcmtpGJVuMA0dYBQ6wRiBCIkK\nkpAOIQgkIJKEZ/44O7EgVdSpqlNVb1V9P2vVOmdfzt7Pe6rq/M679z7vicxEkiSVZ7OBLkCSJHXM\nkJYkqVCGtCRJhTKkJUkqlCEtSVKhDGlJkgplSEuDSETsHRG/iIjVEfGJftzvnRExq5NlEyMiI2Lz\nBuzn6oi4uLfbkYYKQ1rqRxFxb0R8pBeb+G/AvZm5TWZe1sn2X42INRHxXET8MCLG9WJ/AGTm+zPz\nmt5uR1L3GNLS4LIb8GgX65yTmaOAtwOjgEv7vCpJfcKQlnogInateqkrI2JVRFxezT8tIu6PiEsj\n4g8R8buIeH+17MvAYcDlVU/38k62fXxEPBoRL1Q943dW8/8VOLLd4/d6qxoz8wXgn4CWdtveLCLO\njYjfVHXfHBFjqmUjI+K6av4LEfHvEbFTtWzjEYCIGFG177mI+C0w4031PxkR72033RYR17WbviUi\n/iMiXoyIuRGxbyfPw44R8aOqlucj4r6I8DVLw4p/8FI3RcQI4EfAU8BEYBfgxnarHAw8DuwIfA34\nTkREZl4A3EfV083MczrY9l7AD4BPAc3AT4D/GxFbZOZ73vT4J7qocwfgPwNL2s3+BHACcASwM/AH\n4Ipq2SxgNLArsAPwUeCPHWz6TOBYYDLQCnzwrerowJ3AnsBY4GHg+k7W+yywlNrzsBNwPuA4xhpW\nDGmp+6ZQC7jPZ+bLmflqZt7fbvlTmfmtzFwPXAOMoxYy9TgR+HFm3p2Za6kdqt4K+Mtu1HdZRLwI\nPEftjcJ/bbfsLOCCzFyamX8C2oAPVhd9raUWzm/PzPWZOT8zX+pg+x8C/j4zn87M54H/0Y3ayMzv\nZubqdvufFBGjO1h1LbXnbrfMXJuZ96VfNqBhxpCWum9XakG8rpPl/7HhTma+Ut0dVee2d6bWQ9/w\n+NeBp6n11uv1icwcDRwAbA+Mb7dsN+C26hDyC8AiYD21NxHfB/4FuDEinomIr0VEUyc1Pt1u+qkO\n1ulQdaj8K9Xh9peAJ6tFO3aw+iXUjgLcFRG/jYhz692PNFQY0lL3PQ1M6OFHjrrqCT5DLUgBiIig\n9qZgWbd3lPkr4GLgimo7UKv9/Zm5XbufkZm5rOqtfikz96HWcz8WOLWDTS+vatpgwpuWvwz8p3bT\nb2t3/2+AmcB7qR1an7ihqR3UvzozP5uZewDHAZ+JiOldt1waOgxpqfseohZUX4mIrasLrg6t87Er\ngD3eYvnNwIyImF71Yj8L/An4fz2s9Rpq536Pr6b/N/DliNgNICKaI2Jmdf/IiNi/Ouf+ErXDzes7\nqfETETE+IrYH3tzDXQD8dUQ0RcSbz1lvU7VnFbUg/++dFR4Rx0bE26s3GC9VtXRUjzRkGdJSN1Xn\nmo+j9hGn31O7uOnEOh/+D9TOAf8hIjb5nHNmPg6cDPxPaueUjwOOy8zXeljra8BlwBfb7f8OaoeQ\nVwM/p3ahG9R6vLdSC8RFwL8B17Gpb1E7LP5Lahd+/fBNy78I/AW1i9K+BNzQbtm11A6PLwMeq/bf\nmT2BnwJrgJ8B/ysz732r9kpDTXgdhiRJZbInLUlSoQxpSZIKZUhLklQoQ1qSpEL1+qvlumPHHXfM\niRMn9ucuJUkqzvz585/LzOau1uvXkJ44cSLz5s3rz11KklSciKhrpD4Pd0uSVChDWpKkQhnSkiQV\nql/PSUuSOrZ27VqWLl3Kq6++OtClqIFGjhzJ+PHjaWrq6AvlumZIS1IBli5dyjbbbMPEiRP585eW\naTDLTFatWsXSpUvZfffde7QND3dLUgFeffVVdthhBwN6CIkIdthhh14dHTGkJakQBvTQ09vfqSEt\nSVKhPCctSQVqa+v/7Y0YMYL999+fdevWsfvuu/P973+f7bbbrtv7+shHPsJnPvMZ9tlnnzfMv/rq\nq5k3bx6XX355t7cJMGrUKNasWVPXutOmTePSSy+ltbV147x58+Zx7bXXctllm3yVe7HsSUuSANhq\nq61YsGABjzzyCGPGjOGKK67o0Xa+/e1vbxLQJWhtbe3zgF6/fn1Dt2dIS5I2MXXqVJYtW7Zx+pJL\nLuGggw7igAMO4MILLwTg5ZdfZsaMGUyaNIn99tuPm266Caj1YjcMAf29732PvfbaiyOOOIIHHnhg\n4/ZOO+00br311o3To0aNAmDNmjVMnz6dAw88kP3335/bb799k9qWL1/O4YcfTktLC/vttx/33Xdf\nXW269957OfbYYwFoa2vj9NNPZ9q0aeyxxx5vCO/rrruOKVOm0NLSwllnnbUxeM8++2xaW1vZd999\nNz4HUBvy+qKLLuLd7343t9xyS1211MvD3ZKkN1i/fj1z5szhjDPOAOCuu+5i8eLFPPTQQ2Qmxx9/\nPHPnzmXlypXsvPPO/PjHPwbgxRdffMN2li9fzoUXXsj8+fMZPXo0Rx55JJMnT37LfY8cOZLbbruN\nbbfdlueee45DDjmE448//g0XYN1www0cffTRXHDBBaxfv55XXnmlR+389a9/zT333MPq1avZe++9\nOfvss1myZAk33XQTDzzwAE1NTXzsYx/j+uuv59RTT+XLX/4yY8aMYf369UyfPp2FCxdywAEHbKz7\n/vvv71Edb8WQliQB8Mc//pGWlhaefPJJ3vWud3HUUUcBtZC+6667NgbsmjVrWLx4MYcddhif+9zn\n+MIXvsCxxx7LYYcd9obtPfjgg0ybNo3m5tqXPZ144ok88cQTb1lDZnL++eczd+5cNttsM5YtW8aK\nFSt429vetnGdgw46iNNPP521a9dywgkn0NLS0qP2zpgxgy233JItt9ySsWPHsmLFCubMmcP8+fM5\n6KCDNj4nY8eOBeDmm2/mqquuYt26dSxfvpzHHntsY0ifeOKJPaqhKx7uliQBfz4n/dRTT/Haa69t\nPCedmZx33nksWLCABQsWsGTJEs444wz22msv5s+fz/777895553HRRddtMk2O/sI0uabb87rr7++\ncfuvvfYaANdffz0rV65k/vz5LFiwgJ122mmTzxkffvjhzJ07l1122YVTTjmFa6+9tkft3XLLLTfe\nHzFiBOvWrSMzmTVr1sa2Pv7447S1tfG73/2OSy+9lDlz5rBw4UJmzJjxhrq23nrrHtXQFXvSkoa8\n7lwp3eirqgej0aNHc9lllzFz5kzOPvtsjj76aL74xS9y0kknMWrUKJYtW0ZTUxPr1q1jzJgxnHzy\nyYwaNYqrr776Dds5+OCD+eQnP8mqVavYdtttueWWW5g0aRJQO487f/58PvShD3H77bezdu1aoHbI\nfOzYsTQ1NXHPPffw1FObfqPjU089xS677MKZZ57Jyy+/zMMPP8ypp57akLZPnz6dmTNn8ulPf5qx\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x284bdb61a58>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of LinearRegression on train is 0.7800507922784476\n",
      "The r2 score of LinearRegression on test is 0.6110737383431918\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x284bded24a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 在训练集上观察预测残差的分布，看是否符合模型假设：噪声为0均值的高斯噪声\n",
    "f, ax = plt.subplots(figsize=(7, 5))\n",
    "f.tight_layout()\n",
    "ax.hist(y_train - y_train_pred_lr, bins=40, label='Residuals Linear', color='b', alpha=.5);\n",
    "ax.set_title(\"cnt of Residuals\")\n",
    "ax.legend(loc='best');\n",
    "plt.show()\n",
    "\n",
    "# 使用r2_score评价模型在测试集和训练集上的性能，并输出评估结果\n",
    "# 训练集\n",
    "print('The r2 score of LinearRegression on train is', r2_score(y_train, y_train_pred_lr))\n",
    "# 测试集\n",
    "print('The r2 score of LinearRegression on test is', r2_score(y_test, y_test_pred_lr))\n",
    "\n",
    "# 还可以观察预测值与真值的散点图\n",
    "plt.figure(figsize=(8, 6))\n",
    "plt.scatter(y_train, y_train_pred_lr)\n",
    "plt.plot([0, 1], [0, 1], '--k')   # 数据已经标准化，3倍标准差即可\n",
    "plt.axis('tight')\n",
    "plt.xlabel('True cnt')\n",
    "plt.ylabel('Predicted cnt')\n",
    "# plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The value of default measurement of SGDRegressor on train is 0.7800456645075362\n",
      "The value of default measurement of SGDRegressor on test is 0.6113432618864012\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:578: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    }
   ],
   "source": [
    "# 线性模型，随机梯度下降优化模型参数\n",
    "# 随机梯度下降一般在大数据集上应用，其实本项目不适合用\n",
    "from sklearn.linear_model import SGDRegressor\n",
    "\n",
    "# 使用默认配置初始化线\n",
    "sgdr = SGDRegressor(max_iter=1000)\n",
    "\n",
    "# 训练：参数估计\n",
    "sgdr.fit(X_train, y_train)\n",
    "\n",
    "# 预测\n",
    "# sgdr_y_predict = sgdr.predict(X_test)\n",
    "\n",
    "# 使用SGDRegressor模型自带的评估模块(评价准则为r2_score)，并输出评估结果\n",
    "print('The value of default measurement of SGDRegressor on train is', sgdr.score(X_train, y_train))\n",
    "print('The value of default measurement of SGDRegressor on test is', sgdr.score(X_test, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.2 正则化的线性回归（L2正则 --> 岭回归）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of RidgeCV on train is 0.7800453482523895\n",
      "The r2 score of RidgeCV on test is 0.6112208547950979\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nCgeMmZml4v8D/kL0tTi7M8MAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x284bdf1add8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                     coef_lr                coef_ridge     columns\n",
      "6      [0.15337438668107722]     [0.15294091362291298]       atemp\n",
      "0       [0.0663166033313414]     [0.06588603021869363]      season\n",
      "3      [0.01165296559275157]    [0.011588600286346354]     weekday\n",
      "4  [-0.00019464679464113914]  [-0.0001675787283919039]  workingday\n",
      "1   [-0.0013982385782882406]  [-0.0009296726025905394]        mnth\n",
      "2    [-0.008215187791432333]   [-0.008210219144400541]     holiday\n",
      "8    [-0.027034963344830288]   [-0.026968789923178194]   windspeed\n",
      "7     [-0.02843015804487096]    [-0.02825499716691669]         hum\n",
      "5    [-0.039158976103326186]    [-0.03919855043602431]  weathersit\n",
      "alpha is: 1.0\n"
     ]
    }
   ],
   "source": [
    "# 岭回归／L2正则\n",
    "# class sklearn.linear_model.RidgeCV(alphas=(0.1, 1.0, 10.0), fit_intercept=True,\n",
    "#                                  normalize=False, scoring=None, cv=None, gcv_mode=None,\n",
    "#                                  store_cv_values=False)\n",
    "from sklearn.linear_model import RidgeCV\n",
    "\n",
    "# 设置超参数（正则参数）范围\n",
    "alphas = [ 0.01, 0.1, 1, 10,100]\n",
    "# n_alphas = 20\n",
    "# alphas = np.logspace(-5,2,n_alphas)\n",
    "\n",
    "# 生成一个RidgeCV实例\n",
    "ridge = RidgeCV(alphas=alphas, store_cv_values=True)\n",
    "\n",
    "# 模型训练\n",
    "ridge.fit(X_train, y_train)\n",
    "\n",
    "# 预测\n",
    "y_test_pred_ridge = ridge.predict(X_test)\n",
    "y_train_pred_ridge = ridge.predict(X_train)\n",
    "\n",
    "# 评估，使用r2_score评价模型在测试集和训练集上的性能\n",
    "print('The r2 score of RidgeCV on train is', r2_score(y_train, y_train_pred_ridge))\n",
    "print('The r2 score of RidgeCV on test is', r2_score(y_test, y_test_pred_ridge))\n",
    "\n",
    "\n",
    "mse_mean = np.mean(ridge.cv_values_, axis=0)\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas), 1))\n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\": list(columns), \"coef_lr\": list(lr.coef_.T), \"coef_ridge\": list(ridge.coef_.T)})\n",
    "fs = fs.sort_values(by=['coef_lr'], ascending=False)\n",
    "print(fs)\n",
    "print('alpha is:', ridge.alpha_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.3 正则化的线性回归（L1正则 --> Lasso）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of LassoCV on train is 0.7146586416355829\n",
      "The r2 score of LassoCV on test is 0.5412966785175253\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\coordinate_descent.py:1094: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nIf1/cX58PmZKHNcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x284c033f278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha is: 0.031531503717565974\n",
      "   coef_lasso                    coef_lr                coef_ridge     columns\n",
      "6    0.130084      [0.15337438668107722]     [0.15294091362291298]       atemp\n",
      "0    0.041827       [0.0663166033313414]     [0.06588603021869363]      season\n",
      "3    0.000000      [0.01165296559275157]    [0.011588600286346354]     weekday\n",
      "4    0.000000  [-0.00019464679464113914]  [-0.0001675787283919039]  workingday\n",
      "1    0.000000   [-0.0013982385782882406]  [-0.0009296726025905394]        mnth\n",
      "2   -0.000000    [-0.008215187791432333]   [-0.008210219144400541]     holiday\n",
      "8   -0.000000    [-0.027034963344830288]   [-0.026968789923178194]   windspeed\n",
      "7   -0.000000     [-0.02843015804487096]    [-0.02825499716691669]         hum\n",
      "5   -0.029783    [-0.039158976103326186]    [-0.03919855043602431]  weathersit\n",
      "alpha is: 1.0\n"
     ]
    }
   ],
   "source": [
    "# ### Lasso／L1正则\n",
    "# class sklearn.linear_model.LassoCV(eps=0.001, n_alphas=100, alphas=None, fit_intercept=True,\n",
    "#                                    normalize=False, precompute=’auto’, max_iter=1000,\n",
    "#                                    tol=0.0001, copy_X=True, cv=None, verbose=False, n_jobs=1,\n",
    "#                                    positive=False, random_state=None, selection=’cyclic’)\n",
    "\n",
    "\n",
    "# 设置超参数搜索范围\n",
    "# alphas = [ 0.01, 0.1, 1, 10,100]\n",
    "\n",
    "# 生成一个LassoCV实例\n",
    "# lasso = LassoCV(alphas=alphas)\n",
    "lasso = LassoCV()\n",
    "\n",
    "#训练（内含CV）\n",
    "lasso.fit(X_train, y_train)\n",
    "\n",
    "#测试\n",
    "y_test_pred_lasso = lasso.predict(X_test)\n",
    "y_train_pred_lasso = lasso.predict(X_train)\n",
    "\n",
    "\n",
    "# 评估，使用r2_score评价模型在测试集和训练集上的性能\n",
    "print('The r2 score of LassoCV on train is', r2_score(y_train, y_train_pred_lasso))\n",
    "print('The r2 score of LassoCV on test is', r2_score(y_test, y_test_pred_lasso))\n",
    "\n",
    "mses = np.mean(lasso.mse_path_, axis=1)\n",
    "plt.plot(np.log10(lasso.alphas_), mses)\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "\n",
    "print('alpha is:', lasso.alpha_)\n",
    "\n",
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\": list(columns),\n",
    "                   \"coef_lr\": list(lr.coef_.T),\n",
    "                   \"coef_ridge\": list(ridge.coef_.T),\n",
    "                   \"coef_lasso\": list(lasso.coef_.T)})\n",
    "fs = fs.sort_values(by=['coef_lr'], ascending=False)\n",
    "print(fs)\n",
    "print('alpha is:', ridge.alpha_)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
